package com.example.gulimall.order.service.impl;

import com.example.gulimall.order.entity.OrderEntity;
import com.example.gulimall.order.entity.OrderReturnReasonEntity;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.common.utils.PageUtils;
import com.example.common.utils.Query;

import com.example.gulimall.order.dao.OrderItemDao;
import com.example.gulimall.order.entity.OrderItemEntity;
import com.example.gulimall.order.service.OrderItemService;
   //queues 要监听的队列
@RabbitListener(queues = {"hello-java-queue"})
@Service("orderItemService")
public class OrderItemServiceImpl extends ServiceImpl<OrderItemDao, OrderItemEntity> implements OrderItemService {

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<OrderItemEntity> page = this.page(
                new Query<OrderItemEntity>().getPage(params),
                new QueryWrapper<OrderItemEntity>()
        );

        return new PageUtils(page);
    }
    /**  监听消息，这个注解必须在容器中的组件才可以使用

         message 原生消息的详细信息，头+体
         T 泛型 OrderReturnReasonEntity 如果知道消息体的发送消息类型直接将消息体映射到指定的泛型实体上
     场景：
        quque : 可以有多个用户监听但是只有一个用户可以收到消息，只要消息收到了，立即删除消息
            1  订单服务启动多个：同一个消息，只有一个客户端收到
            2  只有一个消息处理完成，方法运行结束，才可以接收下一个消息
     */
   // @RabbitListener(queues = {"helllo-java-quque"}) 标识在类上，监听哪个队列
    @RabbitHandler // 标识在方法上，用来做重载，接收同一个队列不同消息类型的消息
    public void recieveMessage(Message message,
                               OrderReturnReasonEntity content, Channel channel){

        //消息体内容
        byte[] body = message.getBody();
        //消息头内容
        MessageProperties messageProperties = message.getMessageProperties();
        long deliveryTag = messageProperties.getDeliveryTag();


        if (deliveryTag%2==0){
            try {
                // 签收消息，false 不批量签收，消费一条签收一条
                channel.basicAck(deliveryTag,false);
                System.out.println("签收了消息："+content.getName());
            } catch (IOException e) {

            }
        }else {
            // 退回消息
            try {
                //long var1:拒收消息标签, boolean var3：是否批量拒收，如果为true，这之前的消息批量拒收,
                // boolean var4:true 消息拒收，如果为true则发回服务器，重新入队
                // 这里直接停止运行idea会默认执行完，所以即使发回了服务器 rabbitmq还是会没有消息，因为重新入队
                // 又重新消费了 然后新的deliveryTag %2就不起作用了
                channel.basicNack(deliveryTag,false,false);
                //long var1, boolean var3
               // channel.basicReject();
                System.out.println("没有签收消息："+content.getName());
            } catch (IOException e) {

            }


        }
     //   System.out.println("消息处理完成=》"+content.getName());


    }
    @RabbitHandler // 标识在方法上，用来做重载，接收同一个队列不同消息类型的消息
    public void recieveMessage(Message message,
                               OrderEntity content){
        System.out.println("接搜到消息："+content);
        //消息体内容
        byte[] body = message.getBody();
        //消息头内容
        MessageProperties messageProperties = message.getMessageProperties();
       // System.out.println("消息处理完成=》"+content);


    }

}